package com.zy.explore.sys.application.service;

import com.zy.explore.common.infrastructure.base.mybatis.BaseDao;
import com.zy.explore.common.infrastructure.base.mybatis.BaseServiceImpl;
import com.zy.explore.sys.domain.mybatis.dao.SysUserDao;
import com.zy.explore.sys.domain.mybatis.dao.UserMsgDao;
import com.zy.explore.sys.domain.mybatis.entity.StationMsg;
import com.zy.explore.sys.domain.mybatis.entity.SysUser;
import com.zy.explore.sys.domain.mybatis.entity.UserMsg;
import com.zy.explore.sys.interfaces.frm.SendToUserFrm;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * 用户消息表(表user_msg)服务接口实现类
 *
 * @author ChinaYin  主页:https://gitee.com/zy-explorej2ee 邮箱:zyexplorej2ee@sina.com
 * @date 2021年06月13日 19:00:24
 */
@Service
public class UserMsgService extends BaseServiceImpl<UserMsg, Long, Object> {

    /**
     * 注入持久层对象
     */
    @Resource
    private UserMsgDao dao;

    @Resource
    private SysUserDao sysUserDao;

    /**
     * 定义抽象方法getDao获取当前实体Mapper对象
     *
     * @return 当前实体Mapper对象
     */
    @Override
    protected BaseDao<UserMsg> getDao() {
        return this.dao;
    }

    /**
     * 发送站内信
     *
     * @param stationMsg 站味精
     * @param users      用户
     * @return int
     */
    public int sendMsg(StationMsg stationMsg, List<SendToUserFrm> users) {
        int result = 0;
        // 如果是发布时间是当前时间，则创建站内信和用户的关联关系
        int thousand = 1000;
        int sixty = 60;
        if ((stationMsg.getPublishTime().getTime() / thousand / sixty) != (System.currentTimeMillis() / thousand / sixty)) {
            return result;
        }
        // 如果发送对象不为空，则给发送对象建立关系，否则给所有用户建立关系
        if (!CollectionUtils.isEmpty(users)) {
            users.forEach(user -> {
                UserMsg userMsg = UserMsg.builder().msgId(stationMsg.getId()).userId(user.getId()).build();
                insertSelective(userMsg);
            });
            result = users.size();
        } else {
            // 给所有正常的用户发送站内信
            List<SysUser> userList = sysUserDao.getNormalUserList();
            if (!CollectionUtils.isEmpty(userList)) {
                userList.forEach(user -> {
                    UserMsg userMsg = UserMsg.builder().msgId(stationMsg.getId()).userId(user.getId()).build();
                    insertSelective(userMsg);
                });
                result = userList.size();
            }
        }
        return result;
    }

    /**
     * 查询可发送站内信的用户列表
     *
     * @return {@link List<SysUser>}
     */
    public List<SysUser> getSendUserList() {
        return sysUserDao.getNormalUserList();
    }

}